/**
 * @file mod_protect_zone.h
 * @author Linquan  
 * @brief 防护区集合设备节点
 * @version 1.0
 * @date 2024-08-11
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#ifndef PROTECT_ZONE_H
#define PROTECT_ZONE_H


/*===========================[Includes]======================================*/
#include <stdint.h>
#include <time.h>



#include "../circuit_config.h"


/*===========================[Defines]=======================================*/

/*===========================[Macros]========================================*/



/*===========================[Typedef]=======================================*/



/**
 * @brief 防护区集合设备的配置信息
 * 
 */
typedef struct 
{
    uint32_t                node_num;  // 防护区集合中节点数量
    circuit_node_addr_t*     dev_node_ptr; //设备节点配置信息的指针，挂着这个防护区中的设备节点信息。       
    // TODO: 这里节点地址需要换成，设备节点end_node这种类型。直接指向具体busmap中的设备，取出报警信息。
        
}CONFIG_INFO_TYPE(TYPE_PROTECT_ZONE);




/** TODO: 防护区这种 不算一个真实设备的的设备节点，需要有实时状态吗？ 每次遍历防护区的配置信息中的数据应该就够启动条件了。
 * 但是 如果要显示防护区的实时状态，那就得加这个实时状态信息 
 * 
 * */




// 火灾报警级别：0无报警，1预警，2热失控报警，3热失控火灾。
// 其中2和3均属于国标中的"热失控火灾报警状态"，3是更严重的等级(可以启动灭火器)。
enum fire_level_t { LV_NONE=0, LV_PRE_ALARM, LV_ALARM, LV_FIRE, };

// 首警信息
struct first_fire_t {
    time_t start_at;
    enum fire_level_t fire_level;
};



/**
 * @brief 防护区集合设备设备的实时状态信息
 * 
 */
typedef struct 
{
    ////// TODO: 这里凑合写一点数据种类,意思一下,后期在编写设备模块数据时 再确定 /////
    struct first_fire_t first_fire; // 首警记录

    // 内部状态
    uint8_t manual_mode; // 防护区控制模式：手动模式或自动模式
    uint8_t request_start, request_stop; // 防护区开关请求：急启 急停
    uint8_t signal_count; // 信号个数，后面的数组依次存储探测器信号（按时间先后顺序）
    time_t  signals_at[2];     // 信号开始时间
    uint8_t signals_rawlv[2];  // 信号原始报警等级
    void *  signals_source[2]; // 信号来源


    
}RT_DATA_TYPE(TYPE_PROTECT_ZONE);





extern const node_operate_irf_t OP_FUNC_IRF(TYPE_PROTECT_ZONE);










/*===========================[Global Prototypes]=============================*/

















#endif